// 重要信息：
// 1. 等待玩家扔骰子（收到玩家扔骰子的结果后隐藏）
// 2. 走到陷阱或奖励时的提示
// 3. 游戏结束，显示输赢结果
// 4. 游戏开始
// 5. 提示该某玩家扔骰子

// 重要信息显示方式：
// 1. 在页面中间地图之上显示一个提示框，短暂时间后渐隐消失
// -------------------------------------------------------------
//
// 一般提示信息：
// 1. 玩家登入信息
// 2. 玩家离开信息
// 3.

// 一般提示信息显示方式：
// 在页面中上端滑出一个消息提示条，短暂时间后向上滑动消失


//TODO list:
// 1. 扔骰子的动画
// 2. 设置扔骰子超时时间，及处理策略
// 3. 红点和蓝点，也要显示在客户端
// 4. 红点和蓝点在地图上错开
// 5. 红点和蓝点移动的时候在地图上闪动（n 帧动画）
var tipTimer;
var infoTimer;
var HIDE_DELAY = 2000;

var messages_en = {
  gameStart: 'Game started!',
  throwAgain: 'Throw dice again.',
  backToStart: 'Player $1 goes back to the start point, orz...',
  theWinner: 'The winner is $1',
  throwTip: 'Your turn, shake your device to throw dice~~~',
  waitingOtherPlayer: 'Waiting for other player...',
  throwResult: 'You got ',
  win: 'You win!',
  loss: 'You loss:(',
  waiting: 'Gaming, please wait a moment...',
  retry: 'Retry',
  playAgain: 'Play again!',
  lostConnection: 'Lost connection.',
  loginAs: 'You logged as player $1',
  browserNotSupported: 'Your browser are not supported'
};

var messages_zh_cn = {
  gameStart: '游戏开始！',
  throwAgain: '再扔一次:)',
  backToStart: '回到起点:(',
  pauseThrow: '停扔骰子 $1 次:(',
  pauseThrowText: '玩家 $1 停扔骰子 $2 次，',
  theWinner: '玩家 $1 获胜！',
  throwTip: '该你了，晃动你的手机或平板来掷骰子~',
  waitingOtherPlayer: '等待其他用户……',
  throwResult: '你扔了 $1 点:)',
  win: '你赢了！',
  loss: '你输了:(',
  waiting: '游戏进行中，等一会儿吧:)',
  retry: '重试',
  playAgain: '再玩一次！',
  lostConnection: '连接丢失',
  loginAs: '你作为玩家 $1 登录',
  playerReady: '玩家 $1 就绪',
  forward: '前进 $1 步',
  backward: '后退 $1 步',
  playerLeave: '玩家 $1 离开了',
  startThrowBy: '玩家 $1 先扔骰子',
  turnPlayer: '轮到玩家 $1 扔骰子',
  throwByShake: '晃动你的手机或平板来掷骰子~',
  throwByTouch: '随意滑一下屏幕来掷骰子~',
  browserNotSupported: '你的浏览器不支持该游戏',
  clientWelcome: '欢迎来到飞行棋游戏！',
  lastBattleWinner: '上一局游戏的胜者是玩家 $1',
  viewDisconnection: '游戏已重置！',
  viewNotReady: '游戏没有准备好',
  gameStop: '玩家 $1 离开了，游戏中止。'
};

var Message = {
  messages: null,
  messageHidingTime: 500,

  registerMessages: function(messages) {
    this.messages = messages;
  },
  
  /**
   * Get specified message by id.
   * @param {String} msgId
   * @param {String|Array} substitution 1 - 9 substitution strings
   */
  get: function(msgId, substitution) {
    var message = this.messages[msgId];
    if (substitution) {
      if (substitution.constructor === Array) {
        message = message.replace(/\$\d/g, function(sub) {
          return substitution[sub.substring(1) - 1]
        });
      } else { // string or number
        message = message.replace('$1', substitution);
      }
    }
    return message;
  },

  setMainInfo: function(msg) {
    $('#main-info').addClass('show').html(msg);
  },

  showMainInfo: function(msg, callback, notAutoHide) {
    clearTimeout(infoTimer);
    this.setMainInfo(msg);
    $.setDialogPosition($('#main-info').get());
    if (!notAutoHide) {
      infoTimer = setTimeout(function() {
        Message.hideMainInfo(callback);
      }, HIDE_DELAY);
    } else {
      callback && callback();
    }
  },

  hideMainInfo: function(callback) {
    $('#main-info').removeClass('show');
    if (callback) {
      setTimeout(function() {
        callback();
      }, this.messageHidingTime);
    }
  },

  showTip: function(message) {
    clearTimeout(tipTimer);
    var $tip = $('#tip');
    $tip.text(message).attr('title', message).addClass('show');
    var left = (window.innerWidth - $tip.get().clientWidth) / 2;
    left = left < 0 ? 0 : left;
    $tip.css('left', left + 'px');
    tipTimer = setTimeout(function() {
      Message.hideTip();
    }, HIDE_DELAY);
  },

  hideTip: function() {
    $('#tip').removeClass('show');
  }
};

Message.registerMessages(messages_zh_cn);